package cn.tedu.charcount;

// Map阶段

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

// 在MapReduce中，要求传入的数据必须能够被序列化
// KEYIN - 输入的键的类型。默认情况下，如果不指定，表示当前数据的字节偏移量
// VALUEIN - 输入的值的类型。默认情况下，如果不指定，表示当前要处理的一行数据
// KEYOUT - 输出的键的类型。当前案例中，输出的键是字符
// VALUEOUT - 输出的值的类型。当前案例中，输出的值是次数
public class CharCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    private final IntWritable once = new IntWritable(1);

    // key：行的字节偏移量
    // value：要处理的一行数据
    // context：环境参数。可以利用这个参数将结果传递给Reduce
    // 逐行处理数据，每处理一行数据，调用一次map方法
    @Override
    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        // hello
        // 拆分字符
        char[] cs = value.toString().toCharArray();
        //[h, e, l, l, o]
        // 方式一：h:1 e:1 l:2 o:1
        // 方式二：h:1 e:1 l:1 l:1 o:1
        for (char c : cs) {
            context.write(new Text(c + ""), once);
        }
    }
}
